﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Web;
using System.Web.Services;

using BMG.DAL;

namespace BMG.BLL.Classes
{
    /// <summary>
    /// Application BMG
    /// Création le 17/04/2011
    /// 
    /// Classe business de gestion des données de type PRODUIT
    /// 
    /// Modifications:
    /// -
    /// </summary>
    public static class PRODUIT_MANAGER
    {
        #region METHODS

        #region Get

        /// <summary>
        /// Méthode de récupération de la liste des produits
        /// </summary> 
        /// <param name="aWithNoChoice">Avec ou sans un choix vide</param>
        /// <returns>Datatable</returns>
        [WebMethod(Description = "Récupère la liste des produits")]
        public static DataTable GetList(bool aWithNoChoice)
        {
            try
            {
                DataTable dt =  Data_Provider.GetProduitList();
                if (aWithNoChoice) //Si on veux un choix "vide"
                {
                   //Creation d'une nouvelle row
                   DataRow Empty = dt.NewRow();
                   Empty["intitule_pro"] = "-";
                   Empty["id_pro"] = -1;
                   //Insertion de celle-ci dans la table (1ere position)
                   dt.Rows.InsertAt(Empty,0);
                }
                return dt;

            }
            catch (Exception ex)
            {
                //TODO-BEN Gestion des exceptions
                throw ex;
            }
        }

        /// <summary>
        /// Méthode de récupération de la liste des produits filtrée
        /// </summary>
        /// <param name="aDescriptionNom">Nom ou description du produit</param>
        /// <param name="aID_CAT">Identifiant de la catégorie</param>
        /// <returns>Datatable</returns>
        [WebMethod(Description="Récupère la liste des produits selon certains critères")]
        public static DataTable GetList(String aDescriptionNom, int? aID_CAT)
        {
            try
            {
                return Data_Provider.GetProduitslist(aDescriptionNom, aID_CAT);
            }
            catch (Exception ex)
            {
                //TODO-BEN Log des exceptions
                throw ex;
            }
        }

        /// <summary>
        /// Méthode de récupération de l'historique des modifications d'un produit£
        /// </summary>
        /// <param name="aID_PRODUIT">Identifiant du produit, si ce parametre est null c'est tout les produits qui seront concernés</param>
        /// <param name="aDateMin">Date inférieure de la tranche de temps</param>
        /// <param name="aDateMax">Date supérieure de la tranche de temps</param>
        /// <returns>DataTable</returns>
        public static DataTable GetHistorique(int? aID_PRODUIT, DateTime aDateMin, DateTime aDateMax)
        {
            try
            {
                return Data_Provider.GetProduitHistorique(aID_PRODUIT, aDateMin, aDateMax);
            }
            catch (Exception ex)
            {
                //TODO-BEN Gestion des logs d'exception
                throw;
            }
        }

        /// <summary>
        /// Méthode de récupération des détails d'un produit
        /// </summary>
        /// <param name="aID_PRODUIT">Identifiant du produit</param>
        /// <returns>DataRow</returns>
        [WebMethod(Description= "Récupère les détails d'un produit")]
        public static DataRow Get(int aID_PRODUIT)
        {
            try
            {
                return Data_Provider.GetProduit(aID_PRODUIT);
            }
            catch (Exception ex)
            {
                //TODO-BEN Gestion des exceptions, logs dans un fichier??
                throw;
            }
        }

        #endregion

        #region Update
        /// <summary>
        /// Méthode de mise à jour d'un produit 
        /// </summary>
        /// <param name="aID_PRODUIT">Identifiant du produit</param>
        /// <param name="aINTITULE">Intitulé du produit</param>
        /// <param name="aDESCRIPTION">Description du produit</param>
        /// <param name="aPRIX">Prix du produit</param>
        /// <param name="aSTOCK">Quantité en Stock</param>
        /// <param name="aID_CAT">Identifiant de la catégorie du produit</param>
        /// <returns></returns>
        public static int Update(
            int aID_PRODUIT,
            string aINTITULE,
            string aDESCRIPTION,
            decimal aPRIX,
            int aSTOCK, 
            int aID_CAT)
        {
            try
            {
                return Data_Provider.UpdateProduit(aID_PRODUIT,aINTITULE,aDESCRIPTION,aPRIX,aSTOCK,aID_CAT);
            }
            catch (Exception ex)
            {
                //TODO-BEN Gestion des exceptions
                throw;
            }
        }

        /// <summary>
        /// Update multiple de produits
        /// </summary>
        /// <param name="aListeDesID">Liste des ID a updater</param>       
        /// <param name="aID_CAT">Identifiant de la catégorie</param>
        /// <returns></returns>
        public static int Update(
            List<int> aListeDesID,           
            int aID_CAT)
        {
            try
            {
                foreach (int ID in aListeDesID)
                {
                    if (Data_Provider.UpdateProduitCat(ID, aID_CAT) < 1)
                    {
                        return -1;
                    }
                }
                return 1;
            }
            catch (Exception)
            {
                return - 1;
                throw;
            }

        }

        #endregion

        #region Insert
        /// <summary>
        /// Méthode d'insertion d'un produit dans la structure de persistance
        /// </summary>
        /// <param name="aIntitule">Intitule du produit</param>
        /// <param name="aDescription">Description du produit</param>
        /// <param name="aPrix">Prix du produit</param>
        /// <param name="aStock">Quantité en stock</param>
        /// <param name="aID_CAT">Catégorie du produit</param>
        /// <returns>-1 si probleme, 1 si ok</returns>
        public static int Insert(
            string aIntitule,
            string aDescription,
            decimal aPrix,
            int aStock,
            int aID_CAT)
        {
            try
            {
                return Data_Provider.InsertProduit(aIntitule, aDescription, aPrix, aStock, aID_CAT);
            }
            catch (Exception)
            {
                return -1;
                //TODO-BEN Geston des exceptions
            }
        }

        #endregion

        #region Delete
        /// <summary>
        /// Méthode de suppression d'un produit
        /// </summary>
        /// <param name="aID_PRODUIT">Identifiant du produit a supprimer</param>
        /// <returns>-1 si problème, 1 si ok</returns>
        public static int Delete(int aID_PRODUIT)
        {
            try
            {
                return Data_Provider.DeleteProduit(aID_PRODUIT);
            }
            catch (Exception)
            {
                return -1;
                //TODO-BEN Gestion des exceptions
            }
        }
        #endregion

        #region Misc
       
        #endregion

        #endregion
    }
}
